﻿// 注意区分是调用拷贝构造函数，还是调用赋值运算符重载
class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	Date(const Date& d)// 拷贝构造函数
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	// 传引⽤返回减少拷⻉
	// d1 = d2;
	Date& operator=(const Date& d)// 赋值运算符重载
	{
		// 要检查⾃⼰给⾃⼰赋值的情况
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		// d1 = d2表达式的返回对象应该为d1，也就是*this
		return *this;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2024, 7, 5);
	Date d2(d1);// 这⾥是拷⻉构造
	Date d3 = d2;// 这⾥是拷⻉构造
	d1 = d3;// 这⾥是赋值运算符重载
	
	// 赋值运算符重载完成两个已经存在的对象直接的拷⻉赋值
	// ⽽拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象
	return 0;
}


// 显示实现普通取地址运算符重载和const取地址运算符重载
#include<iostream>
using namespace std;
class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	Date* operator&()// 普通取地址运算符重载
	{
		return this;
	}
	const Date* operator&()const// const取地址运算符重载
	{
		return this;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2024, 7, 5);
	cout << &d1 << endl;// &d1调用普通取地址运算符重载

	const Date d2(2024, 8, 5);
	cout << &d2 << endl;// d2调用const取地址运算符重载
	return 0;
}